package excercise;

public class EX03_OOp4 {

	
	public static void main(String[] args) {
		////1번
		RetangleVO gab = new RetangleVO(4,40,"red");
			gab.getArea = RetangleService.gets(gab.width, gab.height);
			gab.getPerimeter = RetangleService.gets2(gab.width, gab.height);
			gab.show();
		
		////2번
		//Fand ss = new Fand(new FanVO().FAST, true, 10, "Yellow");	 
		//이런식으로도 사용할 수 있지만, 이럼 너무 길고 괜한거 하나 더만들어야함.
		Fand ss = new Fand(Fand.FAST, true, 10, "Yellow");	 
			FanService.get(ss);
		//이렇게 하면 바로 찍는것보다 돌아가기 때문에 약칸 늦음
		
		////3번
		AccountVO sdg = new AccountVO(5587, 20000, 4.5F, "1113");
			sdg.getMonthlyInterestRate = AccountService.getMonthlyInterestRate(sdg.interestRate);
			
			AccountService.withdraw(2500,sdg.balance);
			System.out.println(sdg.balance);
			// call by value(값에 의한 전달)
			// 메서드의 매개변수 유형이 기본 자료형인 경우
			// 기본 자료형 값을 메서드의 매개변수로 전달하면
			// JVM은 메서드의 지역변수에 그 값을 복사해 줌
			// 따라서, 메서드의 지역변수 값을 변경하더라도,
			// 전달해준 변수에는 영향을 미치지 않음
			
			/// 이럼 기본적인 balance값은 변하지 않지만,
			AccountService.withdraw(3000 , sdg);
			System.out.println(sdg.balance);
			// call by reference(주소에 의한 전달)
			// 메서드의 매개변수 유형이 참조 자료형인 경우
			// 만일, 참조형 변수를 메서드의 매개변수로 전달하면
			// 지역변수는 참조형 변수가 전달해 준 객체를 가리키게 됨
			// 즉, 참조형 변수에 저장된 값은 실제 값이 아니고
			// 그 값을 가리키는 주소를 의미하기 때문임
			// 따라서, 메서드에서 참조된 객체에 변경을 가하면 
			// 그 변화는 호출된 코드에도 반영됨
					
			/// 이런식으로 할때는 기본 balance값도 변하게 된다.
			/// 즉, 정리하자면 sdg.balance는 불러와서 
			/// service안 balance 값으로 불러가서 수정하지만,
			/// sdg로 할 경우 service안 balance 값도 sdg값에서 불러온 것임으로
			/// 결국 sdg값에 balance 값을 수정하는 셈이되니 
			/// 값이 balance값이 변경된체로 나오는 것이다
			
			AccountService.deposit(3000 , sdg);
			System.out.println(sdg.balance);
			
			
			System.out.println(sdg.getMonthlyInterestRate);
			
			
		
		
		////4번
		StockVO ddo = new StockVO("강강",750000,1500000);
			ddo.getChangePercent = StockService.gab(750000, 1500000); 
			System.out.println(ddo.getChangePercent+"%");
		
		
		
	}

}

////////////////////////////////////////

class RetangleVO{
	float width = 1.0F;
	float height = 1.0F;
	String color = "white";
	float getArea;
	float getPerimeter;
	//기본
	public RetangleVO() {}
	//공유
	public RetangleVO(float width, float height,String color) {
		this.width = width;
		this.height = height;
		this.color = color;	}
	//결과 출력
	void show(){
		System.out.println(width);
		System.out.println(height);
		System.out.println(color);
		System.out.println(getArea);
		System.out.println(getPerimeter);
		//+질로 하나로 하는것도 괜찮앗는데 -_-;;
	}
}
class RetangleService{
	//면적 식
	static float gets(float width, float height){
		return width*height;}
	//둘레 식
	static float gets2(float width, float height){
		return (width*2)+(height*2);}
	}

/////////////////////////////////////////////


class Fand{
	// 속도를 나타내는 상수들은
	// 객체 생성없이 바로 사용가능 해야함으로 스퇘틱으로 꾸며주자
	// 한편, JDK5 이상에서는 이것을 대체하기 위해
	// Enum이라는 새로운 클래스 자료형이 추가됨
	static final int SLOW = 1;
	static final int MEDIUM = 2;
	static final int FAST = 3;
	
	int speed = FAST;
	boolean on = false;
	float radius = 5.0F;
	String color = "blue";
	
	public Fand() {	}
	public Fand(int speed, boolean on, float radius, String color) {
		this.speed = speed;
		this.on = on;
		this.radius = radius;
		this.color = color;
	}
}

class FanService{
//	메서드 다중정의 overloading
//	메서드 서명(인수)만 다르면
//	메서드 이름은 동일하게 작성가능
	static void get(int aa){}
	static void get(Fand ss){ //인수를 이렇게 받을 수도있다. 이게 더 편하징?
		if(ss.on){System.out.println(ss.speed);
		System.out.println(ss.color);
		System.out.println(ss.radius);
		System.out.println("작동중");		}
		else{System.out.println(ss.color);
		System.out.println(ss.radius);
		System.out.println("꺼져있음");
		
//		msg = ss.speed +","+ ss.color +","+ ss.radius + ",작동중";
//		msg = ss.color +","+ ss.radius + ",작동중";
//		이런식으로 if랑 else값을 넣을수도 있으니 참고
//		그러나 이런식으로 하면 ss.??=를 붙여야하고 실행값도 따로 넣어야하니 참고 아니던가?
	}
	}
}	

////////////////////////////////

class AccountVO {
	int aid = 0;
	int balance = 0;
	float interestRate = 0;
	String dataCreated;
	float getMonthlyInterestRate;

	public AccountVO(){
		//여기다가 기본값을 넣는듯.
		aid = 0; balance = 0; interestRate = 0;
		//요런식으로 ㅇㅇ
	}
	public AccountVO(int aid, int balance,
	  float interestRate,String dataCreated){
		this.aid = aid;
		this.balance = balance;
		this.interestRate = interestRate;
		this.dataCreated = dataCreated;
		}
}


class AccountService{
	static float getMonthlyInterestRate(float interestRate){
		return interestRate /12;
	}
	
    static int withdraw(int gold,AccountVO sdg){ 
		sdg.balance -= gold;
		System.out.println("인출 후 잔액 : " + sdg.balance);
		return sdg.balance;
    }
    static int withdraw(int gold, int balance){ 
		balance -= gold;
		System.out.println("인출 후 잔액 : " + balance);
		return balance;
    }
    
    static int deposit(int gold, AccountVO sdg){
		return sdg.balance += gold;
	}
	
}
////////////////////////////////

class StockVO{
	String sname;
	int previousClosingPrice;
	int currentPrice;
	int getChangePercent;
	
	public StockVO() { }
	public StockVO(String sname, int previousClosingPrice, int currentPrice ) { 
		this.sname =sname;
		this.previousClosingPrice = previousClosingPrice;
		this.currentPrice = currentPrice;
	}
}

class StockService{
	static int gab(int previousClosingPrice, int currentPrice) { 
		return (int)((1-((float)currentPrice /previousClosingPrice))*100);
	}
}
